home *** CD-ROM | disk | FTP | other *** search
- /* inc.c */
-
- /* JOVE/MSDOS. K. Mitchum 1/85 */
- /* Modifications for personal use only. */
- /* original code J. Payne LSRHS 5/83 */
- /* Ken Mitchum */
- /* University of Pittsburgh */
- /* Decision Systems Laboratory */
-
- /*
- Jonathan Payne at Lincoln-Sudbury Regional High School 5/25/83
-
- Incremental search here... */
-
- #include "jove.h"
-
- #define FOUND 1
- #define GOBACK 2
- #define CharCom(a, b) (IsFlagSet(globflags, CASEIND) ? (Upperc(a) == Upperc(b)) : (a == b))
-
- extern char searchbuf[];
-
- static char IncBuf[100],
- *incp = 0;
- static int FirstInc = 0;
- static jmp_buf incjmp;
-
-
- IncFSearch()
- {
- IncSearch(1);
- }
-
- IncRSearch()
- {
- IncSearch(-1);
- }
-
-
-
- IncSearch(direction)
- {
- BUFLOC bp;
-
- DOTsave(&bp);
- switch (setjmp(incjmp)) {
- case GOBACK:
- SetDot(&bp);
- break;
-
- case 0:
- IncBuf[0] = 0;
- incp = IncBuf;
- FirstInc = 1;
- SetMark();
- isearch(direction, 0, 0);
- break;
-
- case FOUND:
- default:
- break;
- }
- message(IncBuf); /* Show the search string */
- setsearch(IncBuf); /* This is now the global string */
- }
-
- isearch(direction, failing, ctls)
- {
- char c;
- BUFLOC bp,
- *newdot;
- int nextfail = failing; /* Kind of a temp variable */
-
- DOTsave(&bp);
- for (;;) {
- s_mess("%s%sI-search: %s", failing ? "Failing " : "",
- direction < 0 ? "reverse-" : "", IncBuf);
- c = (*Gtchar)();
- switch (c) {
- case '\177':
- case CTL(H):
- if (!ctls) /* If we didn't repeated the command */
- if (incp > IncBuf)
- *--incp = 0;
- return;
-
- case CTL([):
- okayleave:
- longjmp(incjmp, FOUND);
-
- case CTL(\\):
- c = CTL(S);
- case CTL(R):
- case CTL(S):
- if (FirstInc && incp) { /* We have been here before */
- FirstInc = 0;
- strcpy(IncBuf, searchbuf);
- incp = IncBuf + strlen(IncBuf);
- failing = 0;
- }
- /* If we are not failing, OR we are failing BUT we
- are changing direction, then allow another
- search */
-
- if (!failing || ((direction == -1 && c == CTL(S)) ||
- (direction == 1 && c == CTL(R)))) {
- newdot = dosearch(IncBuf, c == CTL(R) ? -1 : 1, 0);
- if (newdot) {
- SetDot(newdot);
- nextfail = 0;
- } else
- nextfail = 1;
- SetMark();
- isearch(c == CTL(R) ? -1 : 1, nextfail, 1);
- nextfail = failing;
- } else
- rbell();
- break;
-
- case CTL(G):
- longjmp(incjmp, GOBACK);
- /* Easy way out! */
-
- case CTL(Q):
- case CTL(^):
- c = (*Gtchar)() | 0200; /* Tricky! */
- default:
- if (c & 0200)
- c &= 0177;
- else { /* Check for legality */
- if (c < ' ' && c != '\t') {
- peekc = c;
- goto okayleave;
- }
- }
- FirstInc = 0; /* Not first time anymore! */
- *incp++ = c; /* Always put in string */
- *incp = 0;
- if (!failing) {
- if (direction > 0 && CharCom(linebuf[curchar], c))
- ForChar();
- else if (direction < 0 && CharCom(linebuf[curchar + strlen(IncBuf) - 1], c))
- ;
- else if (!failing) {
- newdot = dosearch(IncBuf, direction, 0);
- if (newdot == 0)
- nextfail++;
- else
- SetDot(newdot);
- }
- }
- isearch(direction, nextfail, 0);
- nextfail = failing;
- /* Reset this to what it was, because if we
- * are here again, then we must have deleted
- * back.
- */
- }
- SetDot(&bp);
- }
- }
-
-
- /*---------------------------o.s. dependent--------------------------*/
- /* end */